K-concatenation maximum sum¶
Time: O(N); Space: O(1); medium
Given an integer array arr and an integer k, modify the array by repeating it k times.
For example, if arr = [1, 2] and k = 3 then the modified array will be [1, 2, 1, 2, 1, 2].
Return the maximum sub-array sum in the modified array. Note that the length of the sub-array can be 0 and its sum in that case is 0.
As the answer can be very large, return the answer modulo 10^9 + 7.
Example 1:
Input: arr = [1,2], k = 3
Output: 9
Example 2:
Input: arr = [1,-2,1], k = 5
Output: 2
Example 3:
Input: arr = [-1,-2], k = 7
Output: 0
Constraints:
1 <= len(arr) <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4
Hints:
How to solve the problem for k=1 ?
Use Kadane’s algorithm for k=1.
What are the possible cases for the answer ?
The answer is the maximum between, the answer for k=1, the sum of the whole array multiplied by k, or the maximum suffix sum plus the maximum prefix sum plus (k-2) multiplied by the whole array sum for k > 1.
1. Dynamic programming [O(N), O(1)]¶
[1]:
class Solution1(object):
"""
Time: O(N)
Space: O(1)
"""
def kConcatenationMaxSum(self, arr, k):
"""
:type arr: List[int]
:type k: int
:rtype: int
"""
def max_sub_k_array(arr, k):
result, curr = float("-inf"), float("-inf")
for _ in range(k):
for x in arr:
curr = max(curr+x, x)
result = max(result, curr)
return result
MOD = 10**9+7
if k == 1:
return max(max_sub_k_array(arr, 1), 0) % MOD
return (max(max_sub_k_array(arr, 2), 0) + (k-2)*max(sum(arr), 0)) % MOD
[4]:
s = Solution1()
arr = [1,2]
k = 3
assert s.kConcatenationMaxSum(arr, k) == 9
arr = [1,-2,1]
k = 5
assert s.kConcatenationMaxSum(arr, k) == 2
arr = [-1,-2]
k = 7
assert s.kConcatenationMaxSum(arr, k) == 0